/*
 * declare.c
 *
 *  Created on: 2013-5-17
 *      Author: xkaying
 */

#include "declare.h"
#include "../common/list.h"

#include <assert.h>
#include <stdlib.h>

typedef struct _declareitem
{

	int type;
	char *name;
} DeclareItem;

DeclareItem *DeclareItemInit(int type, char *value)
{
	DeclareItem *pitem;
	pitem = (DeclareItem*) malloc(sizeof(DeclareItem));
	pitem->type = type;
	pitem->name = value;
	return pitem;
}

struct _declare
{
		int isfinal;
		int ismul;
	char *type; //类型
	List *tparam; //模板参数
	char *name; //名字
	List *list; //数据列表
};

Declare *DeclareInit(char *type,int isfinal)
{
	assert(type);
	Declare *pdeclare;
	pdeclare = (Declare*) malloc(sizeof(Declare));
	pdeclare->isfinal=isfinal;
	pdeclare->tparam = 0;
	pdeclare->name = 0;
	pdeclare->list = 0;
	pdeclare->ismul=0;
	return pdeclare;
}

void DeclareAppendName(Declare *pdeclare, char *name)
{
	assert(pdeclare);
	assert(name);
	pdeclare->name = name;
}

void DeclareAppendMul(Declare *pdeclare, int ismul)
{
	assert(pdeclare);
	pdeclare->ismul=ismul;
}

void DeclareAppendTemplate(Declare *pdeclare, char *template)
{
	assert(pdeclare);
	if (pdeclare->tparam == 0) {
		pdeclare->tparam = ListInit();
	}
	ListPush(pdeclare->tparam, template);
}

void DeclareAppendValue(Declare *pdeclare, int type, char *value)
{
	assert(pdeclare);
	assert(value);
	DeclareItem *pitem;
	pitem = DeclareItemInit(type, value);
	if (pdeclare->list == 0) {
		pdeclare->list = ListInit();
	}
	////////////////////////////////
	List *pend;
	pend = ListEnd(pdeclare->list);
	if (pend == 0) {
		pend = ListInit();
		ListPush(pdeclare->list, pend);
	}
	ListPush(pend, pitem);
	///////////////////////////////
}

void DeclareAppendNewValue(Declare *pdeclare, int type, char *value)
{
	assert(pdeclare);
	assert(value);
	DeclareItem *pitem;
	pitem = DeclareItemInit(type, value);
	if (pdeclare->list == 0) {
		pdeclare->list = ListInit();
	}
	////////////////////////////////
	List *pend;
	pend = ListInit();
	ListPush(pdeclare->list, pend);
	ListPush(pend, pitem);
	///////////////////////////////
}
